home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / src / dobj / subs.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-09-09  |  4.0 KB  |  216 lines

  1. /*
  2.  *    (c)Copyright 1992-1997 Obvious Implementations Corp.  Redistribution and
  3.  *    use is allowed under the terms of the DICE-LICENSE FILE,
  4.  *    DICE-LICENSE.TXT.
  5.  */
  6.  
  7. /*
  8.  *  SUBS.C
  9.  */
  10.  
  11. #include "defs.h"
  12. #include <stdarg.h>
  13.  
  14. Prototype int cprintf(const char *ctl, ...);
  15. Prototype int csprintf(char *buf, const char *ctl, ...);
  16. Prototype char * RelocToStr(RelocInfo *r, int offset, int ext, int size, int srcHunk);
  17. Prototype long FixRelocOffset(RelocInfo *r, long offset);
  18. Prototype void cerror(int code, char *ctl, ...);
  19. Prototype int freadl(void *buf, int elsize, int nel, FILE *fi);
  20.  
  21. /*
  22.  *  This is so I can compile under non-ANSI unix which doesn't handle
  23.  *  the return code properly.  DICE does it right, so for DICE compilation
  24.  *  one can simply use printf() and sprintf().
  25.  */
  26.  
  27. #ifndef _DCC
  28.  
  29. int
  30. cprintf(const char *ctl, ...)
  31. {
  32.     va_list va;
  33.     int n;
  34.     char buf[1024];
  35.  
  36.     va_start(va, ctl);
  37.     vsprintf(buf, ctl, va);
  38.     va_end(va);
  39.     n = strlen(buf);
  40.     fwrite(buf, n, 1, stdout);
  41.     return(n);
  42. }
  43.  
  44. int
  45. csprintf(char *buf, const char *ctl, ...)
  46. {
  47.     va_list va;
  48.     int n;
  49.  
  50.     va_start(va, ctl);
  51.     vsprintf(buf, ctl, va);
  52.     n = strlen(buf);
  53.     va_end(va);
  54.     return(n);
  55. }
  56.  
  57. #endif
  58.  
  59. /*
  60.  *  Convert relocation info to string
  61.  */
  62.  
  63. char *
  64. RelocToStr(RelocInfo *r, int offset, int ext, int size, int srcHunk)
  65. {
  66.     Symbol *s;
  67.     static char Buf[SMAX_BUF];
  68.  
  69.     if (r == NULL) {
  70.     Symbol *sym = NULL;
  71.  
  72.     if (srcHunk >= 0)
  73.         sym = FindSymbolOffset(offset, srcHunk);
  74.     if (sym && sym->sm_Value != offset)
  75.         sym = NULL;
  76.  
  77.     if (sym) {
  78.         sprintf(Buf, "%s", sym->sm_Name);
  79.     } else {
  80.         switch(size) {
  81.         case 1:
  82.         sprintf(Buf, "%02x", offset & 0xFF);
  83.         break;
  84.         case 2:
  85.         sprintf(Buf, "%04x", offset & 0xFFFF);
  86.         break;
  87.         case 4:
  88.         sprintf(Buf, "%08x", offset);
  89.         break;
  90.         default:
  91.         sprintf(Buf, "%04x", offset);
  92.         break;
  93.         }
  94.     }
  95.     return(Buf);
  96.     }
  97.  
  98.     if ((s = r->ri_Sym) == NULL) {
  99.     s = FindSymbolOffset(offset, r->ri_DstHunk);
  100.     if (s && s->sm_Value != offset) {
  101.         s = FindSymbolPrev(s);
  102.         while (s && s->sm_Type > 1)
  103.         s = FindSymbolPrev(s);
  104.     }
  105.     if (s)
  106.         offset -= s->sm_Value;
  107.     }
  108.     if (s) {
  109.     if (strlen(s->sm_Name) > sizeof(Buf) - 16)
  110.         s->sm_Name[sizeof(Buf) - 16] = 0;
  111.     if (offset) {
  112.         switch(size) {
  113.         case 1:
  114.         sprintf(Buf, "%s+%02x", s->sm_Name, offset & 0xFF);
  115.         break;
  116.         case 2:
  117.         sprintf(Buf, "%s+%04x", s->sm_Name, offset & 0xFFFF);
  118.         break;
  119.         case 4:
  120.         sprintf(Buf, "%s+%08x", s->sm_Name, offset);
  121.         break;
  122.         default:
  123.         sprintf(Buf, "%s+%04x", s->sm_Name, offset);
  124.         break;
  125.         }
  126.     } else {
  127.         sprintf(Buf, "%s", s->sm_Name);
  128.     }
  129.     } else {
  130.     switch(size) {
  131.     case 1:
  132.         sprintf(Buf, "%02x.%02x", r->ri_DstHunk, offset & 0xFF);
  133.         break;
  134.     case 2:
  135.         sprintf(Buf, "%02x.%04x", r->ri_DstHunk, offset & 0xFFFF);
  136.         break;
  137.     case 4:
  138.         sprintf(Buf, "%02x.%08x", r->ri_DstHunk, offset);
  139.         break;
  140.     default:
  141.         sprintf(Buf, "%02x.%04x", r->ri_DstHunk, offset);
  142.         break;
  143.     }
  144.     }
  145.     if (ext) {
  146.     if (r->ri_RelocFlags & RF_PCREL)
  147.         strcat(Buf, "(pc)");
  148.     if (r->ri_RelocFlags & RF_A4REL)
  149.         strcat(Buf, "(A4)");
  150.     }
  151.     return(Buf);
  152. }
  153.  
  154. long
  155. FixRelocOffset(RelocInfo *r, long offset)
  156. {
  157.     if (r == NULL)
  158.     return(offset);
  159.     if (r->ri_Sym)          /*  symbol relative */
  160.     return(0);
  161.     return(offset);
  162. }
  163.  
  164. void
  165. cerror(int code, char *ctl, ...)
  166. {
  167.     va_list va;
  168.  
  169.     switch(code) {
  170.     case EWARN:
  171.     printf("Warning ");
  172.     break;
  173.     case EERROR:
  174.     printf("Error   ");
  175.     break;
  176.     case EFATAL:
  177.     printf("Fatal   ");
  178.     break;
  179.     }
  180.  
  181.     va_start(va, ctl);
  182.     vprintf(ctl, va);
  183.     va_end(va);
  184.     puts("");
  185.  
  186.     if (code == EFATAL)
  187.     exit(20);
  188. }
  189.  
  190. int 
  191. freadl(void *buf, int elsize, int nel, FILE *fi)
  192. {
  193.     int n = fread(buf, elsize, nel, fi);
  194.  
  195. #ifdef INTELBYTEORDER
  196.     int i;
  197.  
  198.     if (elsize == 2) {
  199.     uword *bptr;
  200.  
  201.     for (bptr = buf, i = n; i > 0; --i, ++bptr) {
  202.         *bptr = ntohs(*bptr);
  203.     }
  204.     } else if (elsize == 4) {
  205.     ulong *bptr;
  206.  
  207.     for (bptr = buf, i = n; i > 0; --i, ++bptr) {
  208.         *bptr = ntohl(*bptr);
  209.     }
  210.     }
  211. #endif
  212.     return(n);
  213. }
  214.  
  215.  
  216.